# 封装：提高程序的安全性
# 继承：提高代码的复用性
# 多态：提高程序的可扩展性和维护性
# ——————————————————————————————————————————封装——————————————————————————————————————————
class Car:
    def __init__(self):
        print('meishier')

    def dec(self):
        print('che')


# 类是对属性和方法的封装   如果不想类被外部访问   赋值的时候前面加两个下划线__
class St:
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # __不想被外部访问


try:
    St1 = St('hehe', 'lala')
    print(St1.name, St1.age)  # 这时的age没有办法被访问
except:
    AttributeError

print(dir(St1))  # 如果用__使age无法被访问  用dir  发现输出里面有一个  '_St__age'
print(St1._St__age)  # 访问了   age        封装封不住了所以是   <君子协议>


# ——————————————————————————————————————————————————————继承————————————————————————————————————————————————————————————————
print('________________________________________')
# python 支持多继承   如果一个类没有继承任何类，那么默认继承object类
class Person:  # 继承object类
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(self.name, self.age)


class Stud(Person):  # 继承了上面的person类
    def __init__(self, name, age, member):
        super().__init__(name, age)
        self.member = member
    def info(self):             #重写了父类的方法
        #super().info()   不用看这行了
        print(self.name, self.age,self.member)

Stud1 = Stud(7,8,9)
Stud1.info()
#方法重写

#多态
class M(object):
    def a(self):
        print('a方法')

class A(M):
    def a(self):
        print('A的a方法')

class B(M):
    def a(self):
        print('B的a方法')

class C():
    def a(self):
        print('C没有继承M类,这是C的a方法')

def A1(hehe):
    hehe.a()

A1(B())
A1(A())
A1(C())   #C没有继承M类  但是也调用了a方法    python是动态语言才可以这么调用    如果是java不行
